package com.ruoyi.pos.domain.device;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.Date;

/**
 * POS设备管理实体类
 * 
 * 用于管理POS系统中的各类设备，包括手持设备、平板设备和收银台设备
 * 支持设备状态监控、版本管理和在线状态跟踪
 * 
 * @author POS System
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class PosDevice extends BaseEntity {
    
    private static final long serialVersionUID = 1L;

    /**
     * 设备ID（主键）
     */
    private Long deviceId;

    /**
     * 设备编号（唯一标识）
     * 
     * 格式建议：POS + 3位数字，如 POS001、POS002
     * 用于设备识别和管理，必须全局唯一
     */
    @Excel(name = "设备编号")
    @NotBlank(message = "设备编号不能为空")
    @Size(min = 3, max = 50, message = "设备编号长度必须在3-50个字符之间")
    private String deviceCode;

    /**
     * 设备名称
     * 
     * 便于用户识别的设备名称，如"收银台1号"、"手持设备A"
     */
    @Excel(name = "设备名称")
    @NotBlank(message = "设备名称不能为空")
    @Size(min = 2, max = 100, message = "设备名称长度必须在2-100个字符之间")
    private String deviceName;
   
    /**
     * IP地址
     * 
     * 设备的网络IP地址，用于网络通信
     * 格式：XXX.XXX.XXX.XXX
     */
    @Excel(name = "IP地址")
    @Size(max = 15, message = "IP地址长度不能超过15个字符")
    private String ipAddress;

    /**
     * Android设备唯一标识
     * 
     * Android系统生成的设备唯一标识符，用于设备绑定
     */
    @Excel(name = "Android ID")
    @Size(max = 64, message = "Android ID长度不能超过64个字符")
    private String androidId;

    /**
     * APP版本号
     * 
     * POS应用程序的版本号，格式：主版本.次版本.修订版本
     * 示例：1.0.0、2.1.3
     */
    @Excel(name = "APP版本")
    @Size(max = 20, message = "APP版本长度不能超过20个字符")
    private String appVersion;

    /**
     * 系统版本
     * 
     * Android操作系统版本信息
     * 示例：Android 12、Android 13
     */
    @Excel(name = "系统版本")
    @Size(max = 50, message = "系统版本长度不能超过50个字符")
    private String systemVersion;

    /**
     * 最后在线时间
     * 
     * 设备最后一次连接到服务器的时间
     * 用于判断设备在线状态
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "最后在线时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date lastOnlineTime;

    /**
     * 最后同步时间
     * 
     * 设备最后一次与服务器进行数据同步的时间
     * 用于数据同步状态监控
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "最后同步时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date lastSyncTime;

    /**
     * 设备状态
     * 
     * 枚举值：
     * - 0: 停用
     * - 1: 正常
     * - 2: 维护中
     */
    @Excel(name = "设备状态", readConverterExp = "0=停用,1=正常,2=维护中")
    private String status;

    /**
     * 是否删除标志
     * 
     * 0: 未删除
     * 1: 已删除（软删除）
     */
    private Integer isDeleted;

    // ==================== 扩展字段 ====================

    /**
     * 在线状态（非数据库字段）
     * 
     * 根据最后在线时间计算得出的实时在线状态
     * - online: 在线（5分钟内有活动）
     * - offline: 离线
     * - unknown: 未知（从未连接）
     */
    @Excel(name = "在线状态", readConverterExp = "online=在线,offline=离线,unknown=未知")
    private String onlineStatus;

    /**
     * 今日交易笔数（非数据库字段）
     * 
     * 当日该设备处理的交易数量
     */
    @Excel(name = "今日交易笔数")
    private Integer todayTransactionCount;
  

    // ==================== 业务方法 ====================

    /**
     * 判断设备是否在线
     * 
     * @return true: 在线, false: 离线
     */
    public boolean isOnline() {
        if (lastOnlineTime == null) {
            return false;
        }
        // 5分钟内有活动认为在线
        long diffMinutes = (System.currentTimeMillis() - lastOnlineTime.getTime()) / (1000 * 60);
        return diffMinutes <= 5;
    }
  

    /**
     * 获取设备状态显示名称
     * 
     * @return 设备状态的中文名称
     */
    public String getStatusDisplay() {
        if (status == null) {
            return "未知";
        }
        switch (status) {
            case "0":
                return "停用";
            case "1":
                return "正常";
            case "2":
                return "维护中";
            default:
                return "未知状态";
        }
    }

    // ==================== 备用扩展字段 ====================
    
    /**
     * 备用字段1
     */
    private String reserved1;

    /**
     * 备用字段2
     */
    private String reserved2;

    /**
     * 备用字段3
     */
    private String reserved3;

    /**
     * 备用字段4
     */
    private String reserved4;

    /**
     * 备用字段5
     */
    private String reserved5;
}

